package co.yixiang.modules.mp.handler;

import cn.hutool.core.util.ObjectUtil;
import co.yixiang.modules.mp.domain.YxWechatReply;
import co.yixiang.modules.mp.service.YxWechatReplyService;
import com.alibaba.fastjson.JSONObject;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 处理微信关注事件的处理器类
 */
@Component
public class SubscribeHandler extends AbstractHandler {

    /**
     * 自动注入的微信回复服务类
     */
    @Autowired
    private YxWechatReplyService yxWechatReplyService;

    /**
     * 处理微信关注事件的方法
     *
     * @param wxMessage 接收到的微信消息
     * @param context 会话管理器
     * @param weixinService 微信服务接口
     * @param sessionManager 会话管理器
     * @return 发送的微信回复消息
     * @throws WxErrorException 当微信操作失败时抛出的异常
     */
    @Override
    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
                                    Map<String, Object> context, WxMpService weixinService,
                                    WxSessionManager sessionManager) throws WxErrorException {
        // 默认的欢迎关注回复消息
        String str = "你好，欢迎关注XXX!";
        // 查询数据库中是否设置了关注回复
        YxWechatReply wechatReply = yxWechatReplyService.isExist("subscribe");
        if(!ObjectUtil.isNull(wechatReply)){
            // 如果设置了关注回复，则使用设置的回复消息
            str = JSONObject.parseObject(wechatReply.getData()).getString("content");
        }

        try {
            // 构建回复用户的文本消息
            WxMpXmlOutMessage msg= WxMpXmlOutMessage.TEXT()
                    .content(str)
                    .fromUser(wxMessage.getToUser())
                    .toUser(wxMessage.getFromUser())
                    .build();
            return msg;
        } catch (Exception e) {
            // 异常处理：记录日志
            this.logger.error(e.getMessage(), e);
        }

        return null;
    }
}
